﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModeloGaleriaNET;
using System.Data.Objects;

namespace CADs
{
    public class ClienteCAD: BaseCAD
    {
        private int queryCount;
        private List<ClienteFilter> filtros;

        public ClienteCAD()
            : base()
        {
            filtros = new List<ClienteFilter>();
        }

        public List<Cliente> GetAllCliente()
        {
            return contexto.Clientes.Where(c => c.Activo == true).OrderBy(c => c.Id).ToList();
        }

        public void SetQueryFilters(List<ClienteFilter> filters)
        {
            if (filters == null || filters.Count == 0)
            {
                filtros.Clear();
                this.filtros = new List<ClienteFilter>();
                filtros.Add(new ClienteFilter(@"it.activo = true"));
            }
            else
                this.filtros = filters;
        }

        public List<Cliente> GetClientesPaginated(int pagenum = 0)
        {
            int pagesize = int.Parse(Properties.Resources.PageSize);

            ObjectQuery<Cliente> query = contexto.Clientes;
            query.MergeOption = MergeOption.OverwriteChanges;

            foreach (var filtro in filtros)
                query = query.Where(filtro.Condition, filtro.Parameters.ToArray());

            queryCount = query.Count();

            return query.Skip("it.Id", "@Skip", new ObjectParameter("Skip", pagenum * pagesize))
                        .Top("@Limit", new ObjectParameter("Limit", pagesize))
                        .ToList();
        }

        public int GetClientesCount()
        {
            return queryCount;
        }

        public dynamic GetClientesIdNombre()
        {
            return contexto.Clientes.Where(cl => cl.Activo == true).ToList().Select(c => new {c.Id, c.ApellidosNombre})
                .OrderBy(c => c.ApellidosNombre);
        }

        public bool BorrarCliente(Cliente c)
        {
            List<ClientesPropietariosObras> cpos;

            try
            {
                // Si tiene obras en propiedad, quítaselas??
                cpos = c.ObrasEnPropiedad;
                if (cpos != null)
                {
                    foreach(ClientesPropietariosObras cpo in cpos)
                        cpo.FechaFin = DateTime.Now;
                }

                c.Activo = false;
                SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public Cliente GetClienteByNifCif(string input)
        {
            IQueryable<Cliente> clientes;
            clientes = contexto.Clientes.Where(c => c.Activo == true && c.DniCif.Equals(input));
            return clientes == null || clientes.Count() == 0 ? null : clientes.First();
        }

        public bool GuardarNuevoCliente(Cliente c)
        {
            try
            {
                contexto.AddToClientes(c);
                SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool GuardarCambios()
        {
            try
            {
                SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}
